//
//  SQLiteManager.swift
//  FMDB演练
//
//  Created by 刘凡 on 15/10/30.
//  Copyright © 2015年 joyios. All rights reserved.
//

import Foundation

private let dbName = "status.db"

class SQLiteManager {
    /// 单例
    static let sharedManager = SQLiteManager()
    
    /// 全局数据库访问队列
    var queue: FMDatabaseQueue
    
    // 在init方法中，创建数据库，创建Table
    private init() {
        var path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last!
        path = (path as NSString).stringByAppendingPathComponent(dbName)
        
        print("数据缓存路径 \(path)")
        
        queue = FMDatabaseQueue(path: path)
        createTable()
    }
    
    /// 执行 SQL 返回字典数组
    ///
    /// - parameter sql: SQL
    ///
    /// - returns: 字典数组
    func execRecordSet(sql: String) -> [[String: AnyObject]] {
        
        // 定义结果[字典数组]
        var result = [[String: AnyObject]]()
        
        // `同步`执行数据库查询 - FMDB 默认情况下，都是在主线程上执行的
        SQLiteManager.sharedManager.queue.inDatabase { (db) -> Void in
            
            print(NSThread.currentThread())
            
            
            
            guard let rs = db.executeQuery(sql, withParameterDictionary:nil) else {
                print("没有结果")
                
                return
            }
            
            while rs.next() {
                // 1. 列数
                let colCount = rs.columnCount()
                
                // 创建字典
                var dict = [String: AnyObject]()
                
                // 2. 遍历每一列
                for col in 0..<colCount {
                    // 1> 列名
                    let name = rs.columnNameForIndex(col)
                    // 2> 值
                    let obj = rs.objectForColumnIndex(col)
                    
                    // 3> 设置字典
                    dict[name] = obj
                }
                // 将字典插入数组
                result.append(dict)
            }
        }
        
        // 返回结果
        return result
    }

    // MARK: - 创建数据表
    private func createTable() {
        
        // 1. 准备 sql
        let path = NSBundle.mainBundle().pathForResource("db.sql", ofType: nil)
        let sql = try! String(contentsOfFile: path!)
        
        // 2. 执行 sql
        queue.inTransaction { (db, _) -> Void in
            if db.executeStatements(sql) {
                print("创表成功")
            } else {
                print("创表失败")
            }
        }
    }
}